home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / javac / SourceField.class (.txt) < prev   
Encoding:
Java Class File  |  1996-12-14  |  9.8 KB  |  368 lines

  1. package sun.tools.javac;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Enumeration;
  5. import java.util.Hashtable;
  6. import java.util.Vector;
  7. import sun.tools.asm.Assembler;
  8. import sun.tools.java.ClassDeclaration;
  9. import sun.tools.java.ClassDefinition;
  10. import sun.tools.java.ClassNotFound;
  11. import sun.tools.java.Constants;
  12. import sun.tools.java.Environment;
  13. import sun.tools.java.FieldDefinition;
  14. import sun.tools.java.Identifier;
  15. import sun.tools.java.Type;
  16. import sun.tools.tree.CompoundStatement;
  17. import sun.tools.tree.Context;
  18. import sun.tools.tree.Expression;
  19. import sun.tools.tree.ExpressionStatement;
  20. import sun.tools.tree.LocalField;
  21. import sun.tools.tree.MethodExpression;
  22. import sun.tools.tree.Node;
  23. import sun.tools.tree.Statement;
  24. import sun.tools.tree.SuperExpression;
  25.  
  26. public final class SourceField extends FieldDefinition implements Constants {
  27.    Vector args;
  28.    FieldDefinition abstractSource;
  29.    int status;
  30.    static final int PARSED = 0;
  31.    static final int CHECKING = 1;
  32.    static final int CHECKED = 2;
  33.    static final int INLINING = 3;
  34.    static final int INLINED = 4;
  35.    static final int ERROR = 5;
  36.  
  37.    public Vector getArguments() {
  38.       return this.args;
  39.    }
  40.  
  41.    public SourceField(int var1, ClassDefinition var2, String var3, int var4, Type var5, Identifier var6, Vector var7, ClassDeclaration[] var8, Node var9) {
  42.       super(var1, var2, var4, var5, var6, var8, var9);
  43.       super.documentation = var3;
  44.       if (((FieldDefinition)this).isMethod()) {
  45.          this.args = new Vector();
  46.          if (((FieldDefinition)this).isConstructor() || !((FieldDefinition)this).isStatic()) {
  47.             this.args.addElement(new LocalField(var1, var2, 0, var2.getType(), Constants.idThis));
  48.          }
  49.  
  50.          if (var7 != null) {
  51.             Enumeration var10 = var7.elements();
  52.             Type[] var11 = ((FieldDefinition)this).getType().getArgumentTypes();
  53.  
  54.             for(int var12 = 0; var12 < var11.length; ++var12) {
  55.                this.args.addElement(new LocalField(var1, var2, 0, var11[var12], (Identifier)var10.nextElement()));
  56.             }
  57.          }
  58.       }
  59.  
  60.    }
  61.  
  62.    public SourceField(FieldDefinition var1, ClassDefinition var2, Environment var3) {
  63.       this(var1.getWhere(), var2, var1.getDocumentation(), var1.getModifiers() | 1024, var1.getType(), var1.getName(), (Vector)null, var1.getExceptions(var3), (Node)null);
  64.       this.args = var1.getArguments();
  65.       this.abstractSource = var1;
  66.    }
  67.  
  68.    public final ClassDeclaration getDefiningClassDeclaration() {
  69.       return this.abstractSource == null ? super.getDefiningClassDeclaration() : this.abstractSource.getDefiningClassDeclaration();
  70.    }
  71.  
  72.    public Identifier resolve(Environment var1, Identifier var2) throws ClassNotFound {
  73.       return ((SourceClass)((FieldDefinition)this).getClassDefinition()).imports.resolve(var1, var2);
  74.    }
  75.  
  76.    public void check(Environment var1) throws ClassNotFound {
  77.       if (this.status == 0) {
  78.          if (var1.dump()) {
  79.             System.out.println("[check field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  80.             if (((FieldDefinition)this).getValue() != null) {
  81.                ((FieldDefinition)this).getValue().print(System.out);
  82.                System.out.println();
  83.             }
  84.          }
  85.  
  86.          var1 = new Environment(var1, this);
  87.          var1.resolve(super.where, ((FieldDefinition)this).getClassDefinition(), ((FieldDefinition)this).getType());
  88.          if (((FieldDefinition)this).isMethod()) {
  89.             ClassDeclaration var2 = var1.getClassDeclaration(Constants.idJavaLangThrowable);
  90.             ClassDeclaration[] var3 = ((FieldDefinition)this).getExceptions(var1);
  91.  
  92.             for(int var4 = 0; var4 < var3.length; ++var4) {
  93.                ClassDefinition var5;
  94.                try {
  95.                   var5 = var3[var4].getClassDefinition(var1);
  96.                } catch (ClassNotFound var16) {
  97.                   var1.error(super.where, "class.not.found", var16.name, "throws");
  98.                   break;
  99.                }
  100.  
  101.                if (!((FieldDefinition)this).getClassDefinition().canAccess(var1, var5.getClassDeclaration())) {
  102.                   var1.error(super.where, "cant.access.class", var5);
  103.                } else if (!var5.subClassOf(var1, var2)) {
  104.                   var1.error(super.where, "throws.not.throwable", var5);
  105.                }
  106.             }
  107.          }
  108.  
  109.          this.status = 1;
  110.          if (((FieldDefinition)this).isMethod() && this.args != null) {
  111.             int var18 = this.args.size();
  112.  
  113.             label146:
  114.             for(int var20 = 0; var20 < var18; ++var20) {
  115.                LocalField var23 = (LocalField)this.args.elementAt(var20);
  116.                Identifier var26 = ((FieldDefinition)var23).getName();
  117.  
  118.                for(int var6 = var20 + 1; var6 < var18; ++var6) {
  119.                   Identifier var7 = ((LocalField)this.args.elementAt(var6)).getName();
  120.                   if (var26.equals(var7)) {
  121.                      var1.error(((FieldDefinition)this).getWhere(), "duplicate.argument", var26);
  122.                      break label146;
  123.                   }
  124.                }
  125.             }
  126.          }
  127.  
  128.          if (((FieldDefinition)this).getValue() != null) {
  129.             Context var19 = new Context(this);
  130.             if (((FieldDefinition)this).isMethod()) {
  131.                Object var21 = (Statement)((FieldDefinition)this).getValue();
  132.                long var24 = 0L;
  133.  
  134.                LocalField var30;
  135.                for(Enumeration var28 = this.args.elements(); var28.hasMoreElements(); var24 |= 1L << var19.declare(var1, var30)) {
  136.                   var30 = (LocalField)var28.nextElement();
  137.                }
  138.  
  139.                if (((FieldDefinition)this).isConstructor()) {
  140.                   var24 &= -2L;
  141.                   if (!((Statement)var21).firstConstructor() && ((FieldDefinition)this).getClassDefinition().getSuperClass() != null) {
  142.                      Statement[] var31 = new Statement[]{new ExpressionStatement(super.where, new MethodExpression(super.where, new SuperExpression(super.where), Constants.idInit, new Expression[0])), (Statement)var21};
  143.                      var21 = new CompoundStatement(super.where, var31);
  144.                      ((FieldDefinition)this).setValue((Node)var21);
  145.                   }
  146.                }
  147.  
  148.                Hashtable var32 = new Hashtable();
  149.                ((Statement)var21).checkMethod(var1, var19, var24, var32);
  150.                ClassDeclaration[] var8 = ((FieldDefinition)this).getExceptions(var1);
  151.                ClassDeclaration var9 = var1.getClassDeclaration(Constants.idJavaLangError);
  152.                ClassDeclaration var10 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
  153.                Enumeration var11 = var32.keys();
  154.  
  155.                while(var11.hasMoreElements()) {
  156.                   ClassDeclaration var12 = (ClassDeclaration)var11.nextElement();
  157.                   ClassDefinition var13 = var12.getClassDefinition(var1);
  158.                   if (!var13.subClassOf(var1, var9) && !var13.subClassOf(var1, var10)) {
  159.                      boolean var14 = false;
  160.                      if (!((FieldDefinition)this).isInitializer()) {
  161.                         for(int var15 = 0; var15 < var8.length; ++var15) {
  162.                            if (var13.subClassOf(var1, var8[var15])) {
  163.                               var14 = true;
  164.                            }
  165.                         }
  166.                      }
  167.  
  168.                      if (!var14) {
  169.                         Node var37 = (Node)var32.get(var12);
  170.                         var1.error(var37.getWhere(), ((FieldDefinition)this).isInitializer() ? "initializer.exception" : "uncaught.exception", var12.getName());
  171.                      }
  172.                   }
  173.                }
  174.             } else {
  175.                Hashtable var22 = new Hashtable();
  176.                Expression var25 = (Expression)((FieldDefinition)this).getValue();
  177.                var25.checkInitializer(var1, var19, (long)(((FieldDefinition)this).isStatic() ? 0 : 1), ((FieldDefinition)this).getType(), var22);
  178.                ((FieldDefinition)this).setValue(((Node)var25).convert(var1, var19, ((FieldDefinition)this).getType(), var25));
  179.                ClassDeclaration var27 = var1.getClassDeclaration(Constants.idJavaLangThrowable);
  180.                ClassDeclaration var29 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
  181.                Enumeration var33 = var22.keys();
  182.  
  183.                while(var33.hasMoreElements()) {
  184.                   ClassDeclaration var34 = (ClassDeclaration)var33.nextElement();
  185.                   ClassDefinition var35 = var34.getClassDefinition(var1);
  186.                   if (!var35.subClassOf(var1, var29) && var35.subClassOf(var1, var27)) {
  187.                      Node var36 = (Node)var22.get(var34);
  188.                      var1.error(var36.getWhere(), "initializer.exception", var34.getName());
  189.                   }
  190.                }
  191.             }
  192.  
  193.             if (var1.dump()) {
  194.                ((FieldDefinition)this).getValue().print(System.out);
  195.                System.out.println();
  196.             }
  197.          }
  198.  
  199.          this.status = ((FieldDefinition)this).getClassDefinition().getError() ? 5 : 2;
  200.       }
  201.  
  202.    }
  203.  
  204.    void inline(Environment var1) throws ClassNotFound {
  205.       switch (this.status) {
  206.          case 0:
  207.             this.check(var1);
  208.             this.inline(var1);
  209.             return;
  210.          case 1:
  211.          default:
  212.             return;
  213.          case 2:
  214.             if (var1.dump()) {
  215.                System.out.println("[inline field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  216.             }
  217.  
  218.             this.status = 3;
  219.             var1 = new Environment(var1, this);
  220.             if (((FieldDefinition)this).isMethod()) {
  221.                if (!((FieldDefinition)this).isNative() && !((FieldDefinition)this).isAbstract()) {
  222.                   Context var2 = new Context(this);
  223.                   Enumeration var3 = this.args.elements();
  224.  
  225.                   while(var3.hasMoreElements()) {
  226.                      var2.declare(var1, (LocalField)var3.nextElement());
  227.                   }
  228.  
  229.                   ((FieldDefinition)this).setValue(((Statement)((FieldDefinition)this).getValue()).inline(var1, var2));
  230.                }
  231.             } else if (((FieldDefinition)this).getValue() != null) {
  232.                Context var5 = new Context(this);
  233.                ((FieldDefinition)this).setValue(((Expression)((FieldDefinition)this).getValue()).inlineValue(var1, var5));
  234.             }
  235.  
  236.             if (var1.dump()) {
  237.                System.out.println("[inlined field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  238.                if (((FieldDefinition)this).getValue() != null) {
  239.                   ((FieldDefinition)this).getValue().print(System.out);
  240.                   System.out.println();
  241.                } else {
  242.                   System.out.println("<empty>");
  243.                }
  244.             }
  245.  
  246.             this.status = 4;
  247.       }
  248.    }
  249.  
  250.    public Node getValue(Environment var1) throws ClassNotFound {
  251.       if (((FieldDefinition)this).getValue() == null) {
  252.          return null;
  253.       } else {
  254.          switch (this.status) {
  255.             case 0:
  256.                this.check(var1);
  257.                return this.getValue(var1);
  258.             case 2:
  259.                this.inline(var1);
  260.                return this.getValue(var1);
  261.             case 4:
  262.                return ((FieldDefinition)this).getValue();
  263.             default:
  264.                return null;
  265.          }
  266.       }
  267.    }
  268.  
  269.    public boolean isInlineable(Environment var1, boolean var2) throws ClassNotFound {
  270.       if (super.isInlineable(var1, var2)) {
  271.          this.getValue(var1);
  272.          return this.status == 4 && !((FieldDefinition)this).getClassDefinition().getError();
  273.       } else {
  274.          return false;
  275.       }
  276.    }
  277.  
  278.    public Object getInitialValue() {
  279.       return !((FieldDefinition)this).isMethod() && ((FieldDefinition)this).getValue() != null && ((FieldDefinition)this).isFinal() && this.status == 4 ? ((Expression)((FieldDefinition)this).getValue()).getValue() : null;
  280.    }
  281.  
  282.    public void code(Environment var1, Assembler var2) throws ClassNotFound {
  283.       switch (this.status) {
  284.          case 0:
  285.             this.check(var1);
  286.             this.code(var1, var2);
  287.             return;
  288.          case 2:
  289.             this.inline(var1);
  290.             this.code(var1, var2);
  291.             return;
  292.          case 4:
  293.             if (var1.dump()) {
  294.                System.out.println("[code field " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  295.             }
  296.  
  297.             if (((FieldDefinition)this).isMethod() && !((FieldDefinition)this).isNative() && !((FieldDefinition)this).isAbstract()) {
  298.                var1 = new Environment(var1, this);
  299.                Context var3 = new Context(this);
  300.                Statement var4 = (Statement)((FieldDefinition)this).getValue();
  301.                Enumeration var5 = this.args.elements();
  302.  
  303.                while(var5.hasMoreElements()) {
  304.                   LocalField var6 = (LocalField)var5.nextElement();
  305.                   var3.declare(var1, var6);
  306.                }
  307.  
  308.                if (var4 != null) {
  309.                   var4.code(var1, var3, var2);
  310.                }
  311.  
  312.                if (((FieldDefinition)this).getType().getReturnType().isType(11) && !((FieldDefinition)this).isInitializer()) {
  313.                   var2.add(((FieldDefinition)this).getWhere(), 177);
  314.                }
  315.             }
  316.  
  317.             return;
  318.          default:
  319.       }
  320.    }
  321.  
  322.    public void codeInit(Environment var1, Context var2, Assembler var3) throws ClassNotFound {
  323.       if (!((FieldDefinition)this).isMethod()) {
  324.          switch (this.status) {
  325.             case 0:
  326.                this.check(var1);
  327.                this.codeInit(var1, var2, var3);
  328.                return;
  329.             case 2:
  330.                this.inline(var1);
  331.                this.codeInit(var1, var2, var3);
  332.                return;
  333.             case 4:
  334.                if (var1.dump()) {
  335.                   System.out.println("[code initializer  " + ((FieldDefinition)this).getClassDeclaration().getName() + "." + ((FieldDefinition)this).getName() + "]");
  336.                }
  337.  
  338.                if (((FieldDefinition)this).getValue() != null) {
  339.                   Expression var4 = (Expression)((FieldDefinition)this).getValue();
  340.                   if (((FieldDefinition)this).isStatic()) {
  341.                      if (this.getInitialValue() == null && !var4.equalsDefault()) {
  342.                         var4.codeValue(var1, var2, var3);
  343.                         var3.add(((FieldDefinition)this).getWhere(), 179, this);
  344.                         return;
  345.                      }
  346.                   } else if (!var4.equalsDefault()) {
  347.                      var3.add(((FieldDefinition)this).getWhere(), 25, new Integer(0));
  348.                      var4.codeValue(var1, var2, var3);
  349.                      var3.add(((FieldDefinition)this).getWhere(), 181, this);
  350.                   }
  351.                }
  352.  
  353.                return;
  354.             default:
  355.          }
  356.       }
  357.    }
  358.  
  359.    public void print(PrintStream var1) {
  360.       super.print(var1);
  361.       if (((FieldDefinition)this).getValue() != null) {
  362.          ((FieldDefinition)this).getValue().print(var1);
  363.          var1.println();
  364.       }
  365.  
  366.    }
  367. }
  368.